#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

// 1. 定义server类型
typedef websocketpp::server<websocketpp::config::asio> server_t;


// typedef lib::function<void(connection_hdl)> open_handler;
// typedef lib::function<void(connection_hdl)> http_handler;
// typedef lib::function<void(connection_hdl, message_ptr)> message_handler;
void onOpen(websocketpp::connection_hdl hd1) {
    std::cout << "websocket长连接建立成功! \n";
}
void onClose(websocketpp::connection_hdl hd1) {
    std::cout << "websocket长连接建立断开! \n";
}
void onMessage(server_t* server, websocketpp::connection_hdl hdl, server_t::message_ptr msg) {
    // 1. 获取有效消息载荷数据, 进行业务处理 也就是获取到body
    std::string body = msg->get_payload();
    std::cout << "收到消息: " << body << std::endl;
    // 2. 对客户端进行响应
    // 获取通信连接
    auto conn = server->get_con_from_hdl(hdl);
    // 发送数据
    // void send(std::string& payload, frame::opcode::value op);
    conn->send(body + "-Hello!", websocketpp::frame::opcode::value::text);
}

int main()
{
    // 2. 实例化服务器对象
    server_t server;
    // 3. 初始化日志输出 -- 关闭日志输出
    //void set_access_channels(log::level channels);    设置日志打印等级
    server.set_access_channels(websocketpp::log::alevel::none);
    // 4. 初始化asio框架
    server.init_asio();
    // 5. 设置消息处理/连接握手成功/连接关闭回调函数
    //void set_open_handler(open_handler h);
    //void set_close_handler(close_handler h);
    //void set_message_handler(message_handler h);
    server.set_open_handler(onOpen);
    server.set_close_handler(onClose);
    //程序第一次运行的时候就将这个server参数永久的传了过去, 后面的参数就是别人传的
    server.set_message_handler(std::bind(onMessage, &server, std::placeholders::_1, std::placeholders::_2));
    // 6. 启动地址重用
    server.set_reuse_addr(true);
    // 7. 设置监听端口
    server.listen(9090);
    // 8. 开始监听
    server.start_accept();
    // 9. 启动服务器
    server.run();
    return 0;
}